package com.liuyjy.es.wrapper;


import com.liuyjy.utils.utils.LambdaUtils;
import com.liuyjy.utils.utils.SFunction;

import java.util.function.Consumer;

public class EsLambdaUpdateWrapper<T> extends EsBaseWrapper<T, SFunction<T, ?>, EsLambdaUpdateWrapper<T>> {

    public EsLambdaUpdateWrapper() {
        this((T)null);
    }

    public EsLambdaUpdateWrapper(T entity) {
        super.setEntity(entity);
    }

    public EsLambdaUpdateWrapper(Class<T> entityClass) {
        super.setEntityClass(entityClass);
    }

    @Override
    protected EsLambdaUpdateWrapper<T> self() {
        return this;
    }

    @Override
    protected EsLambdaUpdateWrapper<T> and(Consumer<EsLambdaUpdateWrapper<T>> consumer) {
        EsLambdaUpdateWrapper<T> wrapper = new EsLambdaUpdateWrapper<>();
        consumer.accept(wrapper);
        boolQuery.must(wrapper.boolQuery);
        return self();
    }

    @Override
    protected EsLambdaUpdateWrapper<T> or(Consumer<EsLambdaUpdateWrapper<T>> consumer) {
        EsLambdaUpdateWrapper<T> wrapper = new EsLambdaUpdateWrapper<>();
        consumer.accept(wrapper);
        boolQuery.should(wrapper.boolQuery);
        return self();
    }

    // ========== 更新方法 ==========
    public EsLambdaUpdateWrapper<T> set(SFunction<T, ?> field, Object value) {
        updateMap.put(columnToString(field), value);
        return self();
    }

    public EsLambdaUpdateWrapper<T> setSql(String script) {
        // 直接使用脚本更新
        updateMap.put("script", script);
        return self();
    }

    protected String columnToString(SFunction<T, ?> column) {
        return LambdaUtils.resolve(column);
    }

    /**
     * 多字段转换为逗号 "," 分割字符串
     *
     * @param columns 多字段
     */
    protected String[] columnsToString(SFunction<T, ?>... columns) {
        return LambdaUtils.resolve(columns);
    }
}